/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package excelbrini;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.*;
import jxl.*;
import jxl.read.biff.BiffException;
import jxl.write.*;
/**
 *
 * @author morlins
 */
public class MyExcel {
     public static int fromFile2toFile1(IMessageManager man,String file_name1, int labelIndexFile1, boolean debug, String file_name2, int labelIndexFile2, String fileOutput,String CodOrdFile1,String RagSocFile1,String ValVASfile1,String ValADSLfile1,String RagSocFile2,String CodOrdFile2,String ImportoFile2) throws IndexOutOfBoundsException, NumberFormatException {
        try {
             String labelCodOrdFile1 = CodOrdFile1;
            String labelRagSocFile1 = RagSocFile1;
            String labelValVASfile1=ValVASfile1;
            String labelValADSLfile1=ValADSLfile1;
            String labelRagSocFile2=RagSocFile2;
            String labelCodOrdFile2=CodOrdFile2;
            String labelImportoFile2=ImportoFile2;
            
            if(CodOrdFile1.isEmpty()) labelCodOrdFile1 = "ORDINE";
            if(RagSocFile1.isEmpty()) labelRagSocFile1 = "Ragione Sociale";
            if(ValVASfile1.isEmpty()) labelValVASfile1="Valore VAS";
            if(ValADSLfile1.isEmpty()) labelValADSLfile1="Provvigione ADSL";
            if(RagSocFile2.isEmpty()) labelRagSocFile2="ragioneSociale";
            if(CodOrdFile2.isEmpty()) labelCodOrdFile2="codiceOrdine";
            if(ImportoFile2.isEmpty()) labelImportoFile2="importoCompenso";
            Workbook workbook1 = null;
            HashMap<String, ArrayList<String>> hashFile1 = new HashMap<String, ArrayList<String>>();
            HashMap<String, ArrayList<String>> hashFile2 = new HashMap<String, ArrayList<String>>();
            ArrayList<String> labels1 = new ArrayList<String>();
            int file1valoreVASIndex = -1;
            int file1provigioneADSLIndex = -1;
            int file1codOrdineIndex = -1;
            int file1ragioneSocialeIndex = -1;
            int file2ragioneSocialeIndex = -1;
            int file2codOrdineIndex = -1;
            int file2importoCompensoIndex = -1;
            try {
                workbook1 = Workbook.getWorkbook(new File(file_name1));
            } catch (java.lang.StringIndexOutOfBoundsException e) {
                man.showError("errore in apertura file1, ti consiglio di copiare la tabella contenuta in " + file_name1 + "in un nuovo file, facendo iniziare le colonne dalla A");
                return -1;
            }
            Sheet sheet1 = workbook1.getSheet(0);

            Cell cont1 = null;
            for (int i = 0; i < sheet1.getColumns(); i++) {
                cont1 = sheet1.getCell(i, labelIndexFile1);
                if (debug) {
                    System.out.println(i + " :" + cont1.getContents());
                }
                labels1.add(cont1.getContents());
            }

            //per reperire indice intero lista
            file1ragioneSocialeIndex = labels1.indexOf(labelRagSocFile1);
            System.out.println("colonna rag soc file1: " + file1ragioneSocialeIndex);
            if (file1ragioneSocialeIndex < 0) {
                man.showError("non è stata individuata la colonna contenente - " + labelRagSocFile1 + " - nel file 2,\n"
                        + "controllare il nome della colonna o la posizione della prima riga o di avere scelto il file corretto");
                return -1;
            }
            file1codOrdineIndex = labels1.indexOf(labelCodOrdFile1);
            System.out.println("colonna cod ordine file1: " + file1codOrdineIndex);
            if (file1codOrdineIndex < 0) {
                man.showError("non è stata individuata la colonna contenente - " + labelCodOrdFile1 + " - nel file 2,\n"
                        + "controllare il nome della colonna o la posizione della prima riga o di avere scelto il file corretto");
                return -1;
            }
            file1valoreVASIndex = labels1.indexOf(labelValVASfile1);
            System.out.println("colonna Valore VAS file1: " + file1valoreVASIndex);
            if (file1valoreVASIndex < 0) {
                man.showError("non è stata individuata la colonna contenente - " + labelValVASfile1 + " - nel file 2,\n"
                        + "controllare il nome della colonna o la posizione della prima riga o di avere scelto il file corretto");
                return -1;
            }
            file1provigioneADSLIndex = labels1.indexOf(labelValADSLfile1);
            System.out.println("colonna Provvigione ADSL file1: " + file1provigioneADSLIndex);
            if (file1provigioneADSLIndex < 0) {
                man.showError("non è stata individuata la colonna contenente - " + labelValADSLfile1+ " - nel file 2,\n"
                        + "controllare il nome della colonna o la posizione della prima riga o di avere scelto il file corretto");
                return -1;
            }
            for (int s = 0; s < workbook1.getNumberOfSheets(); s++) {
                Sheet sheet = workbook1.getSheet(s);
                for (int j = labelIndexFile1 + 1; j < sheet.getRows(); j++) {
                    if (debug) {
                        System.out.println("-- start line --");
                    }
                    ArrayList<String> rowValues = new ArrayList<String>();
                    for (int i = 0; i < sheet.getColumns(); i++) {
                        cont1 = sheet.getCell(i, j);
                        if (cont1.getType()==CellType.NUMBER)
                        {
                            rowValues.add(""+((NumberCell)cont1).getValue());
                        }
                        else
                        {
                            if(i==file1codOrdineIndex) rowValues.add(cont1.getContents().trim());
                        else rowValues.add(cont1.getContents());
                        }
                        if (debug) {
                            System.out.println(labels1.get(i) + " :" + cont1.getContents());
                        }
                       
                    }
                    hashFile1.put(rowValues.get(file1codOrdineIndex), rowValues);
                    if (debug) {
                        System.out.println("-- end line --");
                    }
                }
            }

            if (debug) {
                System.out.println("-- end file 1 --");
            }

            Workbook workbook = null;
            try {
                workbook = Workbook.getWorkbook(new File(file_name2));
            } catch (java.lang.StringIndexOutOfBoundsException e) {
                man.showError("errore in apertura file2, ti consiglio in copiare " + file_name2 + "in un nuovo file, facendo iniziare le colonne dalla A");
                return -1;
            }
            Sheet sheet = workbook.getSheet(0);
            ArrayList<String> labels = new ArrayList<String>();

            Cell cont = null;
            for (int i = 0; i < sheet.getColumns(); i++) {
                cont = sheet.getCell(i, labelIndexFile2);
                if (debug) {
                    System.out.println(i + " :" + cont.getContents());
                }
                labels.add(cont.getContents());
            }
            //per reperire indice lista
            
            file2ragioneSocialeIndex = labels.indexOf(labelRagSocFile2);
            System.out.println("colonna rag soc file2: " + file2ragioneSocialeIndex);
            if (file2ragioneSocialeIndex < 0) {
                man.showError("non è stata individuata la colonna - "+labelRagSocFile2 +" -  nel file 2,\n"
                        + "controllare il nome della colonna o di avere scelto il file corretto");
                return -1;
            }
            file2codOrdineIndex = labels.indexOf(labelCodOrdFile2);
            System.out.println("colonna cod ordine file2: " + file2codOrdineIndex);
            if (file2codOrdineIndex < 0) {
                man.showError("non è stata individuata la colonna - "+labelCodOrdFile2 +" - nel file 2,\n"
                        + "controllare il nome della colonna o di avere scelto il file corretto");
                return -1;
            }
            file2importoCompensoIndex = labels.indexOf(labelImportoFile2);
            System.out.println("colonna importo CompensoIndex file2: " + file2importoCompensoIndex);
            if (file2importoCompensoIndex < 0) {
                man.showError("non è stata individuata la colonna contenente - "+labelImportoFile2 +" - nel file 2,\n"
                        + "controllare il nome della colonna o la posizione della prima riga o di avere scelto il file corretto");
                return -1;
            }

       //     ArrayList<ArrayList<String>> listFile2 = new ArrayList<ArrayList<String>>();
            for (int j = labelIndexFile2 + 1; j < sheet.getRows(); j++) {
                if (debug) {
                    System.out.println("-- start line --");
                }
                ArrayList<String> rowValues = new ArrayList<String>();
                for (int i = 0; i < sheet.getColumns(); i++) {
                    cont = sheet.getCell(i, j);
                    if (cont.getType() == CellType.NUMBER) {
                        rowValues.add("" + ((NumberCell) cont).getValue());
                    } 
                    else{
                        if(j==file2codOrdineIndex)  rowValues.add(cont.getContents().trim());
                        else rowValues.add(cont.getContents());
                    }
                    if (debug) {
                        System.out.println(labels.get(i) + " :" + cont.getContents());
                    }

                }
                hashFile2.put(rowValues.get(file2codOrdineIndex), rowValues);
           //     listFile2.add(rowValues);
                if (debug) {
                    System.out.println("-- end line --");
                }
            }


            if (debug) {
                System.out.println("\n\n-- end file 2 --\n\n");
            }

            //inizio scrittura file output e confronto
            WritableWorkbook workBookOutput = Workbook.createWorkbook(new File(fileOutput));
            WritableSheet sheetOutput1 = workBookOutput.createSheet("Da_file1_a_file_2", 0);
            Label label = new jxl.write.Label(0, 0, "Ragione sociale");
            sheetOutput1.addCell(label);
            label = new jxl.write.Label(1, 0, "codice ordine");
            sheetOutput1.addCell(label);
            label = new jxl.write.Label(2, 0, "importo ADSL");
            sheetOutput1.addCell(label);
            label = new jxl.write.Label(3, 0, "importo VAS");
            sheetOutput1.addCell(label);
            label = new jxl.write.Label(4, 0, "importo compenso");
            sheetOutput1.addCell(label);
            label = new jxl.write.Label(5, 0, "differenza (importo ADSLoVAS -importo compenso)");
            sheetOutput1.addCell(label); 
            label = new jxl.write.Label(6, 0, "commento");
            sheetOutput1.addCell(label);
            Iterator<ArrayList<String>> iterFile1=hashFile1.values().iterator();
            int i=1;
            
            while (iterFile1.hasNext()) {
                ArrayList<String> el=iterFile1.next();
                String ragSoc = el.get(file1ragioneSocialeIndex);
                String codOrd = el.get(file1codOrdineIndex);
               double valueADSL=0;
               double valueVAS=0;
                if (!ragSoc.isEmpty() && !codOrd.isEmpty()) {
                    String strVal = el.get(file1provigioneADSLIndex).replace(',', '.');
                    if(!strVal.isEmpty())
                        try{
                        valueADSL = Double.parseDouble(strVal);}catch(Exception e){valueADSL=-1; System.err.println("eccezione at: "+el);
                        }
                    else valueADSL=0;
                    strVal = el.get(file1valoreVASIndex).replace(',', '.');
                    if(!strVal.isEmpty()) 
                        try{valueVAS = Double.parseDouble(strVal);}catch(Exception e){valueVAS=-1;System.err.println("eccezione at: "+el);}
                    else valueVAS=0;
                }
                jxl.write.Label labelRagSoc = new jxl.write.Label(0, i, ragSoc);
                sheetOutput1.addCell(labelRagSoc);
                jxl.write.Label labelCodOrd = new jxl.write.Label(1, i, codOrd);
                sheetOutput1.addCell(labelCodOrd);
                jxl.write.Number number = new jxl.write.Number(2, i, valueADSL);
                sheetOutput1.addCell(number);
                number = new jxl.write.Number(3, i, valueVAS);
                sheetOutput1.addCell(number);
                ArrayList<String> list = hashFile2.get(codOrd);
                if (list != null) {
                    double valuefile2 = 0;
                    double valuefile1=valueADSL+valueVAS;
                    String strVal = list.get(file2importoCompensoIndex).replace(',', '.');
                    if (!strVal.isEmpty()) {
                        valuefile2 = Double.parseDouble(strVal);
                        number = new jxl.write.Number(4, i, valuefile2);
                        sheetOutput1.addCell(number);
                         double diff = valuefile1 - valuefile2;
                        number = new jxl.write.Number(5, i, diff);
                        sheetOutput1.addCell(number);
                       String comm=null;
                       if(diff==0) comm="OK"; else comm="DIVERSI";
                       label = new jxl.write.Label(6, i, comm);
                       sheetOutput1.addCell(label);
                } }else {
                    //situazione inaspettata nessun ordine corrispondente trovato
                    label = new jxl.write.Label(6, i, "nessun ordine corrispondente trovato in file2");
                    sheetOutput1.addCell(label);
                }
                i++;
                
            }
            WritableSheet sheetOutput = workBookOutput.createSheet("Da_file2_a_file_1", 1);
            label = new jxl.write.Label(0, 0, "Ragione sociale");
            sheetOutput.addCell(label);
            label = new jxl.write.Label(1, 0, "codice ordine");
            sheetOutput.addCell(label);
            label = new jxl.write.Label(2, 0, "importo compenso");
            sheetOutput.addCell(label);
            label = new jxl.write.Label(3, 0, "importo ADSL");
            sheetOutput.addCell(label);
            label = new jxl.write.Label(4, 0, "importo VAS");
            sheetOutput.addCell(label);
            label = new jxl.write.Label(5, 0, "differenza (importo ADSLoVAS -importo compenso)");
            sheetOutput.addCell(label);
             label = new jxl.write.Label(6, 0, "commento");
            sheetOutput.addCell(label);
            Iterator<ArrayList<String>> iterFile2=hashFile2.values().iterator();
            i=1;
            while (iterFile2.hasNext()) {
                ArrayList<String> el=iterFile2.next();
                String ragSoc = el.get(file2ragioneSocialeIndex);
                String codOrd = el.get(file2codOrdineIndex);
                double value = 0;
                if (!ragSoc.isEmpty() && !codOrd.isEmpty()) {
                    String strVal = el.get(file2importoCompensoIndex).replace(',', '.');
                    try{value = Double.parseDouble(strVal);}catch(Exception e){value=-1;System.err.println("eccezione at "+el);
                    }
                }
                jxl.write.Label labelRagSoc = new jxl.write.Label(0, i, ragSoc);
                sheetOutput.addCell(labelRagSoc);
                jxl.write.Label labelCodOrd = new jxl.write.Label(1, i, codOrd);
                sheetOutput.addCell(labelCodOrd);
                jxl.write.Number number = new jxl.write.Number(2, i, value);
                sheetOutput.addCell(number);
                ArrayList<String> list = hashFile1.get(codOrd);
                if (list != null) {
                    double valueADSL = 0;
                    double valueVAS = 0;
                    String strVal = list.get(file1provigioneADSLIndex).replace(',', '.');
                    if (!strVal.isEmpty()) {
                        try{valueADSL = Double.parseDouble(strVal);}catch(Exception e){valueADSL=-1;System.err.println("eccezione at "+el);}
                    }
                    strVal = list.get(file1valoreVASIndex).replace(',', '.');
                    if (!strVal.isEmpty()) {
                        try{valueVAS = Double.parseDouble(strVal);}catch(Exception e){valueVAS=-1;System.err.println("eccezione at "+el);}
                    }
                    if (valueADSL > 0) {
                        double diff = valueADSL - value;
                        number = new jxl.write.Number(3, i, valueADSL);
                        sheetOutput.addCell(number);
                        number = new jxl.write.Number(5, i, diff);
                        sheetOutput.addCell(number);
                        String comm=null;
                        if(diff==0) comm="OK"; else comm="DIVERSI";
                        label = new jxl.write.Label(6, i, comm);
                        sheetOutput.addCell(label);
                    } else if (valueVAS > 0) {
                        double diff = valueVAS - value;
                        number = new jxl.write.Number(4, i, valueVAS);
                        sheetOutput.addCell(number);
                        number = new jxl.write.Number(5, i, diff);
                        sheetOutput.addCell(number);
                        String comm=null;
                        if(diff==0) comm="OK"; else comm="DIVERSI";
                        label = new jxl.write.Label(6, i, comm);
                        sheetOutput.addCell(label);
                    } else {
                        //situazione inaspettata sia VAS che ADSL < 0
                        label = new jxl.write.Label(6, i, "valori VAS e ADSL entrambi uguali a 0");
                        sheetOutput.addCell(label);
                    }
                } else {
                    //situazione inaspettata nessun ordine corrispondente trovato
                    label = new jxl.write.Label(6, i, "nessun ordine corrispondente trovato in file1");
                    sheetOutput.addCell(label);
                }
                i++;
            }

            System.out.println("finished");
            workBookOutput.write();
            workBookOutput.close();
        } catch (WriteException ex) {
            man.showError("errore nella scrittura del file:\n" + ex.getMessage() + "\n Suggerimento: Hai chiuso il file su cui vuoi scrivere?");
            java.util.logging.Logger.getLogger(MyExcel.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            man.showError("IO Exception:\n" + ex.getMessage());
        } catch (BiffException ex) {
            man.showError("Biff Exception" + ex.getMessage());
        }
        return 1;
    }
}
